package Day012_多线程2.demo03_并发包;

import java.util.concurrent.Semaphore;

/**
 * @author zhangyan
 * @date 2020/4/30 15:08
 */
/*
    Semaphore的主要作用是控制线程的并发数量。
    synchronized可以起到"锁"的作用，但某个时间段内，只能有一个线程允许执行。
    Semaphore可以设置同时允许几个线程执行。
    Semaphore字面意思是信号量的意思，它的作用是控制访问特定资源的线程数目。

Semaphore构造方法：
        public Semaphore(int permits) permits 表示许可线程的数量
        public Semaphore(int permits, boolean fair) fair 表示公平性，如果这个设为 true 的话，下次执行的线程会是等待最久的线程

Semaphore重要方法：
        public void acquire() throws InterruptedException 表示获取许可
        public void release() release() 表示释放许可

        案例: 教室只能容纳3个人,现在有5个人需要进来
 */
public class demo07_Semaphore {
    public static void main(String[] args) {

        ClassRoom cr =new ClassRoom();
        //创建5条线程,执行任务
        MyRunnable5 mr5 = new MyRunnable5(cr);
        new Thread(mr5,"学生1").start();
        new Thread(mr5,"学生2").start();
        new Thread(mr5,"学生3").start();
        new Thread(mr5,"学生4").start();
        new Thread(mr5,"学生5").start();
        //没有限制,5个线程全部执行into
    }
}

class ClassRoom{
    //创建许可对象
    Semaphore sp = new Semaphore(3);

    public void into(){
        //获取许可证,才能进来
        try {
            sp.acquire();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "进入教室");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //出去了,释放许可
        System.out.println(Thread.currentThread().getName() + "出去了");
        sp.release();
    }
}

class MyRunnable5 implements Runnable{

    ClassRoom cr;
    public MyRunnable5(ClassRoom cr){
        this.cr = cr;
    }

    @Override
    public void run() {
        cr.into();// 任务就是进入教室
    }
}